package com.gulimall.order.config.mq;

import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * @Author Rookie-6688
 * @Description
 * @Create 2021-04-27 9:50
 */
@Configuration
public class MyRabbitConfig {


    //消息序列化，转成Json格式
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }


//    // @Autowired 不要自动注入，会循环依赖
//    private RabbitTemplate rabbitTemplate;
//
//    @Primary
//    @Bean
//    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
//        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
//        this.rabbitTemplate = rabbitTemplate;
//        rabbitTemplate.setMessageConverter(messageConverter());
//        initRabbitTemplate();
//        return rabbitTemplate;
//    }
//    /**
//     * 定制RabbitTemplate
//     * 1、服务收到消息就会回调
//     *      1、spring.rabbitmq.publisher-confirms: true
//     *      2、设置确认回调
//     * 2、消息正确抵达队列就会进行回调
//     *      1、spring.rabbitmq.publisher-returns: true
//     *         spring.rabbitmq.template.mandatory: true
//     *      2、设置确认回调ReturnCallback
//     *
//     * 3、消费端确认(保证每个消息都被正确消费，此时才可以broker删除这个消息)
//     *
//     */
//    // @PostConstruct  //MyRabbitConfig对象创建完成以后，执行这个方法
//    public void initRabbitTemplate() {
//
//        /**
//         * 确认回调
//         * 1、只要消息抵达Broker就ack=true
//         * correlationData：当前消息的唯一关联数据(这个是消息的唯一id)
//         * ack：消息是否成功收到
//         * cause：失败的原因
//         */
//        // 消息到达broker
//        rabbitTemplate.setConfirmCallback((correlationData,ack,cause) -> {
//            System.out.println("confirm...correlationData["+correlationData+"]==>ack:["+ack+"]==>cause:["+cause+"]");
//        });
//
//
//        /**
//         * 只要消息没有投递给指定的队列，就触发这个失败回调
//         * message：投递失败的消息详细信息
//         * replyCode：回复的状态码
//         * replyText：回复的文本内容
//         * exchange：当时这个消息发给哪个交换机
//         * routingKey：当时这个消息用哪个路邮键
//         */
//        // 消息未到达队列
//        rabbitTemplate.setReturnCallback((message,replyCode,replyText,exchange,routingKey) -> {
//            // 需要修改数据库 消息的状态【后期定期重发消息】
//            System.out.println("Fail Message["+message+"]==>replyCode["+replyCode+"]" +
//                    "==>replyText["+replyText+"]==>exchange["+exchange+"]==>routingKey["+routingKey+"]");
//        });
//    }
}
